/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufc.quixada.adrs.comandos.admin;

import br.ufc.quixada.adrs.interfaces.Comando;
import br.ufc.quixada.adrs.model.Adrs;
import br.ufc.quixada.adrs.model.Prazo;
import br.ufc.quixada.adrs.service.PrazoService;
import br.ufc.quixada.adrs.util.Msg;
import br.ufc.quixada.adrs.util.UtilAdrs;
import java.util.ArrayList;
import java.util.List;
import java.util.Collections;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author Escritorio projetos
 */
public class CmdAddPrazo implements Comando {

    public String executa(HttpServletRequest request, HttpServletResponse response) {
        String sDataInicio = request.getParameter("dataInicial");
        String sDataFinal = request.getParameter("dataFinal");
        String tipoQuest = request.getParameter("questionario");
        String descricao = request.getParameter("descricao");
        Prazo prazo = (Prazo) request.getSession().getAttribute("prazo");
        request.getSession().removeAttribute("prazo");

        if (tipoQuest == null) {
            request.getSession().setAttribute("erro", Msg.EMPTY_SELECTION_ERROR_QUESTIONNAIRE);
            return "/admin/admin_add_prazo.jsp";
        } else if (sDataInicio == null || sDataFinal == null || sDataInicio.trim().isEmpty() || sDataFinal.trim().isEmpty()) {
            request.getSession().setAttribute("erro", Msg.REQUIRED_DATE_FIELDS);
            return "/admin/admin_add_prazo.jsp";
        } else if (tipoQuest.equals("outro") && (descricao == null || descricao.trim().isEmpty())) {
            request.getSession().setAttribute("erro", Msg.REQUIRED_DESCRICAO_FIELD);
            return "/admin/admin_add_prazo.jsp";
        }
        if (!UtilAdrs.validaData(sDataInicio)) {
            request.getSession().setAttribute("erro", Msg.INPUT_ERROR_WRONG_START_DATE_FORMAT);
            return "/admin/admin_add_prazo.jsp";
        }
        if (!UtilAdrs.validaData(sDataFinal)) {
            request.getSession().setAttribute("erro", Msg.INPUT_ERROR_WRONG_END_DATE_FORMAT);
            return "/admin/admin_add_prazo.jsp";
        }
        if (prazo == null) {
            prazo = new Prazo();
        }
        
        prazo.setInicio(UtilAdrs.treatToDate(sDataInicio));
        prazo.setFim(UtilAdrs.treatToDate(sDataFinal));
        if (prazo.getFim().before(prazo.getInicio())) {
            request.getSession().setAttribute("erro", Msg.INPUT_ERROR_WRONG_START_AND_END_DATE_SEQUENCE);
            return "/admin/admin_add_prazo.jsp";
        }
        
        List<Long> listaIdsAdrsSelecionados = new ArrayList<Long>();
        boolean houveAlgumCheckboxMarcado = request.getParameter("adrsSelecionados") != null ? true : false;
        if (houveAlgumCheckboxMarcado) {
            String[] listIds = request.getParameterValues("adrsSelecionados");
            for (int i = 0; i < listIds.length; i++) {
                listaIdsAdrsSelecionados.add(Long.parseLong(listIds[i]));
            }
        } else {
            request.getSession().setAttribute("erro", Msg.EMPTY_SELECTION_ERROR_ADRS);
            return "/admin/admin_add_prazo.jsp";
        }

        List<Adrs> listaAllAdrs = (ArrayList<Adrs>) request.getSession().getAttribute("listAdrsPrazo");
        List<Adrs> listaAdrsSelecionados = new ArrayList<Adrs>();

        for (Adrs ad : listaAllAdrs) {
            for (Long id : listaIdsAdrsSelecionados) {
                if (id.equals(ad.getId())) {
                    listaAdrsSelecionados.add(ad);
                    break;
                }
            }
        }
        PrazoService ps = new PrazoService();
        prazo.setListaAdrs(listaAdrsSelecionados);
        if (tipoQuest.equals("qualitativo")) {
            prazo.setQualitativo(true);
            prazo.setQuantitativo(false);
            prazo.setSanitario(false);
            prazo.setOutro(false);
        } else if (tipoQuest.equals("quantitativo")) {
            prazo.setQuantitativo(true);
            prazo.setSanitario(false);
            prazo.setQualitativo(false);
            prazo.setOutro(false);
        } else if (tipoQuest.equals("sanitario")) {
            prazo.setSanitario(true);
            prazo.setQualitativo(false);
            prazo.setQuantitativo(false);
            prazo.setOutro(false);
        } else if (tipoQuest.equals("outro")) {
            prazo.setOutro(true);
            prazo.setSanitario(false);
            prazo.setQualitativo(false);
            prazo.setQuantitativo(false);
            prazo.setDescricao(descricao);
        }

        List<Prazo> prazosAbertos = (List<Prazo>) request.getSession().getAttribute("prazosAbertos");

        if (prazo.getId() == null) {
            if (ps.insertPrazo(prazo)) {
                prazosAbertos.add(prazo);
                Collections.sort(prazosAbertos, PrazoService.comparadorPorFim);
                request.getSession().setAttribute("sucesso", Msg.SUCCESSFULLY_ADDED);
            } else {
                request.getSession().setAttribute("erro", Msg.OPERATIONAL_ERROR_REGISTERING_PRAZO);
            }
        } else {
            if (ps.updatePrazo(prazo)) {
                Collections.sort(prazosAbertos, PrazoService.comparadorPorFim);
                request.getSession().setAttribute("sucesso", Msg.SUCCESSFULLY_EDITED);
            } else {
                request.getSession().setAttribute("erro", Msg.OPERATIONAL_ERROR_EDITING);
            }
        }
        return "/admin/admin_gerenciar_prazo.jsp";
    }
}
